package gogoqiu.java.base;

public class KeywordEncryptor {

    /**
     * 使用关键字对字符串进行加密
     * @param str 待加密的字符串
     * @param keyword 加密关键字（不能为空）
     * @return 加密后的字符串
     * @throws IllegalArgumentException 当关键字为空时抛出
     */
    public static String encryptWithKeyword(String str, String keyword) {
        // 处理空关键字情况
        if (keyword == null || keyword.isEmpty()) {
            throw new IllegalArgumentException("关键字不能为空");
        }

        StringBuilder result = new StringBuilder();
        // 遍历字符串的每个字符
        for (int i = 0; i < str.length(); i++) {
            // 获取字符的Unicode编码
            int strCode = str.charAt(i);
            // 循环使用关键字的字符编码（取模实现循环）
            int keyCode = keyword.charAt(i % keyword.length());
            // 异或运算加密，确保结果在0-65535之间（与0xFFFF按位与）
            int encryptedCode = (strCode ^ keyCode) & 0xFFFF;
            // 将加密后的编码转为字符并添加到结果
            result.append((char) encryptedCode);
        }
        return result.toString();
    }

    /**
     * 使用关键字对字符串进行解密（与加密逻辑相同，因XOR运算可逆）
     * @param encryptedStr 待解密的字符串
     * @param keyword 解密关键字（需与加密时一致）
     * @return 解密后的原始字符串
     * @throws IllegalArgumentException 当关键字为空时抛出
     */
    public static String decryptWithKeyword(String encryptedStr, String keyword) {
        // 直接调用加密方法，利用XOR可逆性完成解密
        return encryptWithKeyword(encryptedStr, keyword);
    }

    // 测试示例
    public static void main(String[] args) {
        String original = "Hello, 世界！";
        String keyword = "secret";
        
        // 加密
        String encrypted = encryptWithKeyword(original, keyword);
        System.out.println("加密后：" + encrypted);
        
        // 解密
        String decrypted = decryptWithKeyword(encrypted, keyword);
        System.out.println("解密后：" + decrypted); // 应与原始字符串一致
    }
}
